package com.lost.octopus.es.processor.feign;

import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * es通用基础接口
 * @author zhangbh
 * @param <E> 实体类型
 * @param <I> 实体主键类型
 */
public interface Api<E, I> {

    /**
     * 根据ID查询数据
     * @param id ID
     * @return 数据
     */
    @GetMapping(value = "findById.do", name = "ID查询")
    E findById(@RequestParam I id);

    /**
     * 根据ID批量查询数据
     * @param ids ids
     * @return 数据
     */
    @PostMapping(value = "findAllById.do", name = "ID批量查询")
    Iterable<E> findAllById(@RequestBody List<I> ids);

    /**
     * 用于复杂场景，只能获取待更新数据的ID时使用
     * @param ids ids
     * @return 数据
     */
    @PostMapping(value = "reloadById.do", name = "ID批量更新")
    int reloadById(@RequestBody List<I> ids);

    /**
     * 根据ID保存数据，null字段不更新
     * @param save 保存对象
     */
    @PostMapping(value = "saveOrUpdate.do", name = "更新")
    void saveOrUpdate(@Valid @RequestBody E save);

    /**
     * 根据ID批量保存，null字段不更新
     * @param list
     */
    @PostMapping(value = "batchSaveOrUpdate.do", name = "批量保存更新")
    void batchSaveOrUpdate(@Valid @RequestBody List<E> list);

    /**
     * 通过ID删除
     * @param id id
     */
    @DeleteMapping(value = "deleteById.do", name = "删除")
    void deleteById(@RequestParam I id);

    /**
     * 通过ID批量删除
     * @param ids ids
     */
    @DeleteMapping(value = "deleteAllById.do", name = "批量删除")
    void deleteAllById(@RequestBody List<I> ids);
}
